Flutter 问题 以及 解决方案
包含:遇到的常见问题,以及问题的解决方案,的汇总列表
帮助Flutter开发者解决疑问问题、帮助开发者精通Flutter,并开发Flutter!
1.Scaffold Problems
1. Scaffold.of() called with a context that does not contain a Scaffold
问题描述: 通过使用Scaffold.of(context)来显示“Drawer”、“SnackBar”等widget时,出现上述问题
解决方案:
*出现问题的代码
class BasicWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Basic Widget"),
),
body: new Column(
children: <Widget>[
new RaisedButton(
onPressed: () {
final snackBar = new SnackBar(
content: new Text("这是一个Snackbar"),
action: new SnackBarAction(
label: "Undo",
onPressed: (){
}),
);
Scaffold.of(context).showSnackBar(snackBar);
},
child: new Text("显示Snackbar"),
)
],
));
}
}
*解决问题的代码
class BasicWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Basic Widget"),
),
body: new Builder(builder: (BuildContext context){
return new Column(
children: <Widget>[
new RaisedButton(
onPressed: () {
final snackBar = new SnackBar(
content: new Text("这是一个Snackbar"),
action: new SnackBarAction(
label: "Undo",
onPressed: (){
}),
);
Scaffold.of(context).showSnackBar(snackBar);
},
child: new Text("显示Snackbar"),
)
],
);
}),
);
}
}
2.AppBar Problems
1. AppBar ‘尺寸、宽/高度’的修改
*解决问题的代码
PreferredSizeWidget appBarBottom = TabBar(
tabs: [
Tab(
text: "one",
icon: Icon(Icons.find_in_page),
),
Tab(
text: "two",
icon: Icon(Icons.find_in_page),
),
],
);
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: PreferredSize(
child: AppBar(
bottom: appBarBottom,
),
preferredSize: Size.fromHeight(appBarBottom?.preferredSize?.height),
),
body: TabBarView(
children: [
child,
child,
],
),
),
);
3.HTTP (dart-lang http package)
1. flutter Bad state: Cannot set the body fields of a Request with content-type “appliction/json
*出现问题的条件
步骤1、使用 ‘dart-lang(dart语言官方)’ 的 ‘http(网络包)’
步骤2、使用 POST 请求方式请求接口
步骤3、使用 POST 请求方式的请求头:”content-type:application/json”,
请求体:
var body = {
"key":"value",
}
request.body = body;
flutter Bad state: Cannot set the body fields of a Request with content-type “appliction/json
*解决问题的方法
解:使用jsonEncode包装请求体
var body = {
"key":"value",
}
request.body = jsonEncode(body);
4.Android->Gradle->
1.AndroidX
1.D8: Program type already present: io.flutter.BuildConfig 。
2.D8DexArchiveMerger.mergeDexArchives 。
*出现问题的条件/环境
步骤1、Flutter升级version版本到 version=v1.12.4
步骤2、Android 迁移 AndroidX(Flutter 升级version=v1.12.4后,运行出错:提示Android要迁移到AndroidX)
步骤3、’android包’ 迁移 ‘androidx包’的’Map对照表’ ‘[https://developer.android.com/jetpack/androidx/migrate/class-mappings?hl=en#androidsupporttestrunner]'
步骤4、’包依赖冲突’的错误信息’Program type already present’解决(如果项目依赖了ModelA 和 ModelB,ModelB又依赖了ModelA,那么此时会出现依赖冲突,解决办法:项目只依赖ModelB。参考文档地址:)
步骤5、如果步骤4操作后依然出现’D8: Program type already present: io.flutter.BuildConfig’的错误日志
那么请往下看:
步骤6、’Android gradle version 的兼容、适配、更新’(新建一个flutter项目并运行,如果运行成功,请把新flutter项目的
1、’新项目’中的 android->app->build.gradle文件内的配置更新到’就项目’。
2、’新项目’中的 android->build.gradle文件内的配置更新到’新项目’。
3、’新项目’中的 android->gradle->wrapper->gradle-wrapper.properties文件内的配置更新到’新项目’。
4、’新项目’中的 android->gradle.properties文件内的配置更新到’新项目’。
)